package svm.coelce.parser.dao;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import svm.coelce.parser.data.DadosDaParcela;
import svm.coelce.parser.factory.QueryFactory;
import svm.coelce.parser.jdbc.ConexaoUtil;

public class ContratoGestorDAO {
	public static List<DadosDaParcela> parcelasEmAbertoPorUnidadeDeControle( Integer unidadeDeControle, Integer digitoVerificador ){
		List<DadosDaParcela>	parcelas			= new ArrayList<DadosDaParcela>();
		Map<String, Object>		parametros			= new HashMap<String, Object>();
		DadosDaParcela			parcela				= null,
								parcelaAtual		= null;

		Connection				conexaoGestorWEB	= null;
		PreparedStatement		consulta			= null;
		ResultSet				resultadoConsulta	= null;

		if(	unidadeDeControle != null &&
			digitoVerificador != null ){

			conexaoGestorWEB = ConexaoUtil.getConnection();

			try {
				parametros.put( "unidadeDeControle", unidadeDeControle );
				parametros.put( "digitoVerificador", digitoVerificador );

				consulta			= conexaoGestorWEB.prepareStatement( QueryFactory.gerarConsulta( "consultaContratosGestor", parametros ) );
				resultadoConsulta	= consulta.executeQuery();

				while( resultadoConsulta.next() ){
					if( parcela == null ){
						parcela = new DadosDaParcela( resultadoConsulta );

						parcelas.add( parcela );

						continue;
					}

					parcelaAtual = new DadosDaParcela( resultadoConsulta );

					if( parcelaAtual.getParcelaGestor().equals( parcela.getParcelaGestor() ) && parcelaAtual.getNumeroContrato().equals( parcela.getNumeroContrato() ) ){
						parcela.setValorTotalDaParcela( parcela.getValorTotalDaParcela().add( parcelaAtual.getValorIndividualDaParcela() ).setScale( BigDecimal.ROUND_HALF_EVEN, RoundingMode.HALF_EVEN ) );
						parcelas.add( parcelaAtual );

						for( DadosDaParcela parcelaArmazenada : parcelas ){
							if( parcelaArmazenada.getParcelaGestor().equals( parcela.getParcelaGestor() ) &&
								parcelaArmazenada.getNumeroContrato().equals( parcela.getNumeroContrato() ) ){
								parcelaArmazenada.setValorTotalDaParcela( parcela.getValorTotalDaParcela() );
							}
						}

					} else {
						parcela = parcelaAtual;
						parcelas.add( parcela );
					}
				}

			} catch( SQLException sqlException ){
				sqlException.printStackTrace();

			} finally {
				ConexaoUtil.fecharConexao();
			}
		}

		return parcelas;
	}
}
